﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Text.RegularExpressions;

namespace DataAccessComponents
{
    /// <summary>
    /// Klasa odzwierciedlająca tabele Oferta w bazie danych
    /// </summary>
    public class Oferta : IDataErrorInfo
    {
        /// <summary>
        /// Id oferty
        /// </summary>
        private int id_oferta;

        public int Id_oferta
        {
            get { return this.id_oferta; }
            set { this.id_oferta = value; czy_zmiana = true; }
        }

        /// <summary>
        /// Nazwa oferty
        /// </summary>
        private string nazwa;

        public string Nazwa
        {
            get { return this.nazwa; }
            set { this.nazwa = value; czy_zmiana = true; }
        }

        /// <summary>
        /// Opis oferty
        /// </summary>
        private string opis;

        public string Opis
        {
            get { return this.opis; }
            set { this.opis = value; czy_zmiana = true; }
        }                                

        /// <summary>
        /// Id hotelu w którym bedzie oferta wykorzystywana
        /// </summary>
        private int id_hotelu;

        public int Id_hotelu
        {
            get { return this.id_hotelu; }
            set { this.id_hotelu = value; czy_zmiana = true; }
        }

        /// <summary>
        /// Hotel
        /// </summary>
        private Hotel hotel;

        public Hotel Hotel
        {
            get { return hotel; }
            set { hotel = value; }
        }
        
        /// <summary>
        /// Id kategorii do której przydzielona jest oferta
        /// </summary>
        private int id_kategoria;

        public int Id_kategoria
        {
            get { return this.id_kategoria; }
            set { this.id_kategoria = value; czy_zmiana = true; }
        }

        /// <summary>
        /// Obiekt reprezentujący kategorie
        /// </summary>
        private Kategoria kategoria;

        public Kategoria Kategoria
        {
            get { return this.kategoria; }
            set { this.kategoria = value; czy_zmiana = true; }
        }

        /// <summary>
        /// Skrót oferty
        /// </summary>
        private string skrot;

        public string Skrot
        {
            get { return this.skrot; }
            set { this.skrot = value; czy_zmiana = true; }
        }

        /// <summary>
        /// Id linii lotniczych
        /// </summary>
        private int id_linielotnicze;

        public int Id_linielotnicze
        {
            get { return this.id_linielotnicze; }
            set { this.id_linielotnicze = value; czy_zmiana = true; }
        }

        private LinieLotnicze linielotnicze;

        public LinieLotnicze Linielotnicze
        {
            get { return linielotnicze; }
            set { linielotnicze = value; }
        }


        /// <summary>
        /// Ilosc terminow powiązanych z ofertą
        /// </summary>
        private int ilosc_terminow;

        public int Ilosc_terminow
        {
            get { return ilosc_terminow; }
            set { ilosc_terminow = value; }
        }

        /// <summary>
        /// Typ pokoju oferty
        /// </summary>
        private string typ_pokoju;

        public string Typ_pokoju
        {
            get { return typ_pokoju; }
            set { typ_pokoju = value; czy_zmiana = true; }
        }

        /// <summary>
        /// Cena za doroslego
        /// </summary>
        private Decimal cena_dorosly;

        public Decimal Cena_dorosly
        {
            get { return cena_dorosly; }
            set { cena_dorosly = value; }
        }

        /// <summary>
        /// Cena za dziecko
        /// </summary>
        private Decimal cena_dziecko;

        public Decimal Cena_dziecko
        {
            get { return cena_dziecko; }
            set { cena_dziecko = value; }
        }

        /// <summary>
        /// Cena za dziecko
        /// </summary>
        private Decimal cena_dziecko2lata;

        public Decimal Cena_dziecko2lata
        {
            get { return cena_dziecko2lata; }
            set { cena_dziecko2lata = value; }
        }

        
        private bool czy_zmiana;

        public bool Czy_zmiana
        {
            get { return czy_zmiana; }
            set { czy_zmiana = value; }
        }

        
        /// <summary>
        /// Konstruktor tworzący obiekt Oferta
        /// </summary>
        /// <param name="ido">Id oferty</param>
        /// <param name="na">Nazwa oferty</param>
        /// <param name="op">Opis oferty</param>      
        /// <param name="idh">Id hotelu </param>        
       
        /// <param name="ik">Id kategorii oferty </param>
        /// <param name="ll">Id linie lotnicze </param>
        /// <param name="skr">Skrót nazwy</param>
        /// <param name="ilter">Ilość terminów</param>
        /// <param name="tp">Typ pokoju</param>
        public Oferta(int ido, string na, string op,int idh,int ik,int ll,string skr,int ilter,string tp)
        {
            this.id_oferta = ido;
            this.nazwa = na;
            this.opis = op;                   
            this.id_hotelu = idh;            
            
            this.id_kategoria = ik;
            this.id_linielotnicze = ll;
            this.skrot = skr;
            this.ilosc_terminow = ilter;
            this.typ_pokoju = tp;
            this.cena_dorosly = 0;
            this.cena_dziecko = 0;
            this.cena_dziecko2lata = 0;
        }

        public Oferta()
            : this(0, "", "", 0,0,0,"",0,"")
        { }
        
         public string Error
        {
            get { return string.Empty; }
        }

         public string this[string propertyName]
         {
             get
             {
                 string result = string.Empty;
                 propertyName = propertyName ?? string.Empty;

                 if (propertyName == "Nazwa")
                 {
                     if (string.IsNullOrEmpty(this.Nazwa))
                     {
                         result = "Pole \"Nazwa\" nie może być puste";
                     }
                     else if (Regex.IsMatch(this.Nazwa, @"[@£_^{}\[~\]|ÆæßÉ!¤%&'()\*\+,-.:;<=>§?]+"))
                     {
                         result = "Pole \"Nazwa\" zawiera niedozwolone znaki";
                     }
                 }
                 else if (propertyName == "Skrot")
                 {
                     if (string.IsNullOrEmpty(this.Skrot))
                     {
                         result = "Pole \"Skrot\" nie może być puste";
                     }
                     else if (Regex.IsMatch(this.Skrot, @"[@£_^{}\[~\]|ÆæßÉ!¤%&'()\*\+,-.:;<=>§?]+"))
                     {
                         result = "Pole \"Skrot\" zawiera niedozwolone znaki";
                     }

                 }
                 else if (propertyName == "Id_kategoria")
                 {
                     if (this.Id_kategoria ==0 )
                     {
                         result = "Należy wybrać kategorie";
                     }
                 }
                 else if (propertyName == "Id_hotel")
                 {
                     if (this.Id_hotelu==0)
                     {
                         result = "Należy wybrać hotel";
                     }
                 }
                 else if (propertyName == "Id_linielotnicze")
                 {
                     if (this.Id_linielotnicze == 0)
                     {
                         result = "Należy wybrać linie lotnicze";
                     }
                 }
                 else if (propertyName == "Typ_pokoju")
                 {
                     if (string.IsNullOrEmpty(this.Typ_pokoju))
                     {
                         result = "Należy podać typ pokoju";
                     }
                 }
                 else if (propertyName == "Cena_dorosly")
                 {
                     if (this.Cena_dorosly < 0)
                     {
                         result = "Wartość niemoże być mniejsza niż 0";
                     }
                 }
                 else if (propertyName == "Cena_dziecko")
                 {                     
                     if (this.Cena_dziecko<0)
                     {
                         result = "Wartość niemoże być mniejsza niż 0";
                     }
                 }
                 return result;
             }
         }  
    
    }
}
